package com.cz.design.structure.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class JdkTikTokProxy<T> implements InvocationHandler {

    private T target;

    // 接收被代理对象
    public JdkTikTokProxy(T target) {
        this.target = target;
    }

    /**
     * 获取被代理对象的 代理对象
     */
    public static <T> T getProxy(T t) {
        Object o = Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(), new JdkTikTokProxy(t));
        return (T) o;
    }

    /**
     * 定义目标方法的拦截逻辑：每个方法都会进来的
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 反射执行
        System.out.println("真正执行被代理对象的方法");
        Object invoke = method.invoke(target, args);
        System.out.println("返回值invoke：" + invoke);
        return invoke;
    }
}
